#! /bin/sh
# PCP QA Test No. 220
# Does primary logger die and cleanup when pmcd exits?
#
# Copyright (c) 1995-2002 Silicon Graphics, Inc.  All Rights Reserved.
#

seq=`basename $0`
echo "QA output created by $seq"

# get standard filters
. ./common.product
. ./common.filter
. ./common.check

which netstat >/dev/null 2>&1 || _notrun "netstat not installed"

case $PCP_PLATFORM
in
    linux)
	netstat_args='-n --tcp'
	;;
    openbsd)
	netstat_args='-n -p tcp'
	;;
    *)
	echo "Arrgh ... need netstat TCP+ESTABLISHED+IPADDR options for $PCP_PLATFORM"
	exit
esac

status=0
clean=false
LOCALHOST=`hostname`
LOGGING_DIR="$PCP_ARCHIVE_DIR"

_cleanup()
{
    if $clean
    then
	:
    else
	pmafm $LOGGING_DIR/$LOCALHOST/Latest remove >$tmp.cmd 2>&1 \
	&& $sudo sh $tmp.cmd
	rm -f $tmp.cmd
	# delay to allow pmcd socket to be closed
	#
	for i in 1 2 3 4 5
	do
	    echo "delay $i" >>$seq_full
	    if netstat $netstat_args | grep 44321 >>$seq_full
	    then
		sleep 1
	    else
		break
	    fi
	done
	_service pmcd restart 2>&1 | _filter_pcp_restart
	_wait_for_pmcd
	_restore_auto_restart pmcd
	_service pmlogger restart 2>&1 | _filter_pcp_restart
	_wait_for_pmlogger
	_restore_auto_restart pmlogger
	clean=true

	# for some systems we're seeing ...
	#    Job for pmlogger.service failed because the service did
	#    not take the steps required by its unit configuration.
	# try to figure out why
	#
	if [ "$PCPQA_SYSTEMD" = yes ]
	then
	    eval `systemctl show pmlogger.service --property=ActiveState`
	    if [ "$ActiveState" != active ]
	    then
		$sudo systemctl status pmlogger.service >>$seq_full
		if which journalctl >/dev/null 2>&1
		then
		    $sudo journalctl -xe -u pmlogger.service >>$seq_full
		fi
	    fi
	fi
    fi
    $sudo rm -f $tmp.*
}

trap "_cleanup; exit \$status" 0 1 2 3 15

_stop_auto_restart pmcd
_stop_auto_restart pmlogger

# real QA test starts here

# Make sure we have a stable starting point. This test was passing when
# run alone, but failing if test 184 was run immediately before it.
if ! _service pmlogger restart 2>&1; then _exit 1; fi | _filter_pcp_restart
_wait_for_pmlogger || _exit 1

# all running, get primary pmlogger pid, then stop 'em all
#
_pid=`cat $PCP_RUN_DIR/pmlogger.pid 2>/dev/null`
if [ -z "$_pid" ]
then
    echo "Botch: primary pmlogger PID not found"
    ls -l $PCP_RUN_DIR
fi
if ! _service pmlogger stop 2>&1; then _exit 1; fi \
| _filter_pcp_stop
_wait_pmlogger_end || _exit 1
if ! _service pmcd stop 2>&1; then _exit 1; fi \
| _filter_pcp_stop
_wait_pmcd_end || _exit 1
[ -n "$_pid" ] && _wait_pmlogger_end $_pid
echo "primary pmlogger processes?  expect none"
ps $PCP_PS_ALL_FLAGS | grep '[p]mlogger.* -P'

echo
echo "primary port map? expect none"
if [ -e $PCP_TMP_DIR/pmlogger/primary ]; then
    echo "Eh?!  $PCP_TMP_DIR/pmlogger/primary exists and it should not"
    ls -l $PCP_TMP_DIR/pmlogger/primary
else
    echo "not there - goodness."
fi

# all done
exit
